package 代码随想录_回溯;


/**
 剪枝优化暂时不看

 分割：要有合法性判断的方法 (93.复原IP地址有点难度,感觉是笔试题的难度)

 //收集子集,要放在终止添加的上面,否则会漏掉自己

 注意：集合中是否包含重复元素与结果集中是否要包含重复元素是两个概念

 //结果集中去重就要排序！！！！！！！！！！！！！(子集II、全排列II)

 排列是有序的,也就是说[1,2] 和[2,1] 是两个集合,这和之前分析的子集以及组合所不同的地方。
 元素1在[1,2]中已经使用过了,但是在[2,1]中还要在使用一次1,所以处理排列问题就不用使用startIndex
 但排列问题需要一个used数组,标记已经选择的元素
 全排列中46和47还是区别挺大的

 子集也是一种组合问题，因为它的集合是无序的，子集{1,2} 和 子集{2,1}是一样的。
 那么既然是无序，取过的元素不会重复取，写回溯算法的时候，for就要从startIndex开始，而不是从0开始！
 那什么时候for可以从0开始呢？
 求排列问题的时候，就要从0开始，因为集合是有序的，{1, 2} 和{2, 1}是两个集合


 */
public class Test1 {
    /**
     * void backtracking(参数) {
     *     if (终止条件) {
     *         存放结果;
     *         return;
     *     }
     *     for (选择：本层集合中元素（树中节点孩子的数量就是集合的大小）) {
     *         处理节点;
     *         backtracking(路径，选择列表); // 递归
     *         回溯，撤销处理结果
     *     }
     * }
     */
}
